home *** CD-ROM | disk | FTP | other *** search
- function PROT_UrlCryptoKeyManager(opt_keyFilename, opt_testing) {
- this.debugZone = "urlcryptokeymanager";
- this.testing_ = !!opt_testing;
- this.base64_ = new G_Base64();
- this.clientKey_ = null; // Base64-encoded, as fetched from server
- this.clientKeyArray_ = null; // Base64-decoded into an array of numbers
- this.wrappedKey_ = null; // Opaque base64-encoded server key
- this.rekeyTries_ = 0;
- this.keyFilename_ = opt_keyFilename ?
- opt_keyFilename :
- PROT_globalStore.getKeyFilename();
- this.MAX_REKEY_TRIES = PROT_UrlCryptoKeyManager.MAX_REKEY_TRIES;
- this.CLIENT_KEY_NAME = PROT_UrlCryptoKeyManager.CLIENT_KEY_NAME;
- this.WRAPPED_KEY_NAME = PROT_UrlCryptoKeyManager.WRAPPED_KEY_NAME;
- if (!this.testing_) {
- G_Assert(this, !PROT_UrlCrypto.prototype.manager_,
- "Already have manager?");
- PROT_UrlCrypto.prototype.manager_ = this;
- this.maybeLoadOldKey();
- this.reKey();
- }
- }
- PROT_UrlCryptoKeyManager.MAX_REKEY_TRIES = 2;
- PROT_UrlCryptoKeyManager.CLIENT_KEY_NAME = "clientkey";
- PROT_UrlCryptoKeyManager.WRAPPED_KEY_NAME = "wrappedkey";
- PROT_UrlCryptoKeyManager.prototype.getClientKeyArray = function() {
- return this.clientKeyArray_;
- }
- PROT_UrlCryptoKeyManager.prototype.getWrappedKey = function() {
- return this.wrappedKey_;
- }
- PROT_UrlCryptoKeyManager.prototype.reKey = function() {
- if (this.rekeyTries_ > this.MAX_REKEY_TRIES)
- throw new Error("Have already rekeyed " + this.rekeyTries_ + " times");
- this.rekeyTries_++;
- G_Debug(this, "Attempting to re-key");
- var url = PROT_globalStore.getGetKeyURL();
- if (!this.testing_)
- (new PROT_XMLFetcher()).get(url,
- BindToObject(this.onGetKeyResponse, this));
- }
- PROT_UrlCryptoKeyManager.prototype.maybeReKey = function() {
- if (this.rekeyTries_ > this.MAX_REKEY_TRIES) {
- G_Debug(this, "Not re-keying; already at max");
- return false;
- }
- this.reKey();
- return true;
- }
- PROT_UrlCryptoKeyManager.prototype.hasKey_ = function() {
- return this.clientKey_ != null && this.wrappedKey_ != null;
- }
- PROT_UrlCryptoKeyManager.prototype.replaceKey_ = function(clientKey,
- wrappedKey) {
- if (this.clientKey_)
- G_Debug(this, "Replacing " + this.clientKey_ + " with " + clientKey);
- this.clientKey_ = clientKey;
- this.clientKeyArray_ = this.base64_.decodeString(this.clientKey_);
- this.wrappedKey_ = wrappedKey;
- this.serializeKey_(this.clientKey_, this.wrappedKey_);
- }
- PROT_UrlCryptoKeyManager.prototype.serializeKey_ = function() {
- var map = {};
- map[this.CLIENT_KEY_NAME] = this.clientKey_;
- map[this.WRAPPED_KEY_NAME] = this.wrappedKey_;
- try {
- var appDir = new PROT_ApplicationDirectory();
- if (!appDir.exists())
- appDir.create();
- var keyfile = appDir.getAppDirFileInterface();
- keyfile.append(this.keyFilename_);
- G_FileWriter.writeAll(keyfile, (new G_Protocol4Parser).serialize(map));
- return true;
- } catch(e) {
- G_Error(this, "Failed to serialize new key: " + e);
- return false;
- }
- }
- PROT_UrlCryptoKeyManager.prototype.onGetKeyResponse = function(responseText) {
- var response = (new G_Protocol4Parser).parse(responseText);
- var clientKey = response[this.CLIENT_KEY_NAME];
- var wrappedKey = response[this.WRAPPED_KEY_NAME];
- if (response && clientKey && wrappedKey) {
- G_Debug(this, "Got new key from: " + responseText);
- this.replaceKey_(clientKey, wrappedKey);
- } else {
- G_Debug(this, "Not a valid response for /getkey");
- }
- }
- PROT_UrlCryptoKeyManager.prototype.maybeLoadOldKey = function() {
- var oldKey = null;
- try {
- var appDir = new PROT_ApplicationDirectory();
- var keyfile = appDir.getAppDirFileInterface();
- keyfile.append(this.keyFilename_);
- if (keyfile.exists())
- oldKey = G_FileReader.readAll(keyfile);
- } catch(e) {
- G_Debug(this, "Caught " + e + " trying to read keyfile");
- return;
- }
- if (!oldKey) {
- G_Debug(this, "Couldn't find old key.");
- return;
- }
- oldKey = (new G_Protocol4Parser).parse(oldKey);
- var clientKey = oldKey[this.CLIENT_KEY_NAME];
- var wrappedKey = oldKey[this.WRAPPED_KEY_NAME];
- if (oldKey && clientKey && wrappedKey && !this.hasKey_()) {
- G_Debug(this, "Read old key from disk.");
- this.replaceKey_(clientKey, wrappedKey);
- }
- }
- function TEST_PROT_UrlCryptoKeyManager() {
- if (G_GDEBUG) {
- var z = "urlcryptokeymanager UNITTEST";
- G_debugService.enableZone(z);
- G_Debug(z, "Starting");
- var kf = "keytest.txt";
- function removeTestFile(f) {
- var appDir = new PROT_ApplicationDirectory();
- var file = appDir.getAppDirFileInterface();
- file.append(f);
- if (file.exists())
- file.remove(false /* do not recurse */);
- };
- removeTestFile(kf);
- var km = new PROT_UrlCryptoKeyManager(kf, true /* testing */);
- G_Assert(z, !km.hasKey_(), "KM already has key?");
- km.maybeLoadOldKey();
- G_Assert(z, !km.hasKey_(), "KM loaded non-existent key?");
- km.onGetKeyResponse(null);
- G_Assert(z, !km.hasKey_(), "KM got key from null response?");
- km.onGetKeyResponse("");
- G_Assert(z, !km.hasKey_(), "KM got key from empty response?");
- km.onGetKeyResponse("aslkaslkdf:34:a230\nskdjfaljsie");
- G_Assert(z, !km.hasKey_(), "KM got key from garbage response?");
- var realResponse = "clientkey:24:zGbaDbx1pxoYe7siZYi8VA==\n" +
- "wrappedkey:24:MTr1oDt6TSOFQDTvKCWz9PEn";
- km.onGetKeyResponse(realResponse);
- G_Assert(z, km.hasKey_(), "KM couldn't get key from real response?");
- G_Assert(z, km.clientKey_ == "zGbaDbx1pxoYe7siZYi8VA==",
- "Parsed wrong client key from response?");
- G_Assert(z, km.wrappedKey_ == "MTr1oDt6TSOFQDTvKCWz9PEn",
- "Parsed wrong wrapped key from response?");
- km = new PROT_UrlCryptoKeyManager(kf, true /* testing */);
- G_Assert(z, !km.hasKey_(), "KM already has key?");
- km.maybeLoadOldKey();
- G_Assert(z, km.hasKey_(), "KM couldn't load existing key from disk?");
- G_Assert(z, km.clientKey_ == "zGbaDbx1pxoYe7siZYi8VA==",
- "Parsed wrong client key from disk?");
- G_Assert(z, km.wrappedKey_ == "MTr1oDt6TSOFQDTvKCWz9PEn",
- "Parsed wrong wrapped key from disk?");
- var realResponse2 = "clientkey:24:dtmbEN1kgN/LmuEoYifaFw==\n" +
- "wrappedkey:24:MTpPH3pnLDKihecOci+0W5dk";
- km.onGetKeyResponse(realResponse2);
- G_Assert(z, km.hasKey_(), "KM couldn't replace key from server response?");
- G_Assert(z, km.clientKey_ == "dtmbEN1kgN/LmuEoYifaFw==",
- "Replace client key from server failed?");
- G_Assert(z, km.wrappedKey_ == "MTpPH3pnLDKihecOci+0W5dk",
- "Replace wrapped key from server failed?");
- km = new PROT_UrlCryptoKeyManager(kf, true /* testing */);
- G_Assert(z, !km.hasKey_(), "KM already has key?");
- km.maybeLoadOldKey();
- G_Assert(z, km.hasKey_(), "KM couldn't load existing key from disk?");
- G_Assert(z, km.clientKey_ == "dtmbEN1kgN/LmuEoYifaFw==",
- "Replace client on from disk failed?");
- G_Assert(z, km.wrappedKey_ == "MTpPH3pnLDKihecOci+0W5dk",
- "Replace wrapped key on disk failed?");
- km = new PROT_UrlCryptoKeyManager(kf, true /* testing */);
- km.reKey();
- for (var i = 0; i < km.MAX_REKEY_TRIES; i++)
- G_Assert(z, km.maybeReKey(), "Couldn't rekey?");
- G_Assert(z, !km.maybeReKey(), "Rekeyed when max hit");
- removeTestFile(kf);
- G_Debug(z, "PASSED");
- }
- }
-